home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / programming / asm / fdtools11.lha / fd2stub.c < prev    next >
C/C++ Source or Header  |  1994-06-27  |  8KB  |  264 lines

  1. /* fd2stub.c - generate .a file with stub routines */
  2.  
  3. #include "fdparse.h"
  4.  
  5. char REG[16][3] = { "D0","D1","D2","D3","D4","D5","D6","D7",
  6.                     "A0","A1","A2","A3","A4","A5","A6","A7" };
  7.  
  8. char rbuff[100];
  9.  
  10. long offset;
  11.  
  12. void dobuff(char *rbuff,UWORD regs)
  13.  
  14. {
  15.   int i,j;
  16.   int flag = 0;
  17.  
  18.   rbuff[0] = 0;
  19.  
  20.   i = 0;
  21.   while(i < 8) {
  22.     if(regs & (1 << i)) {
  23.       if(flag) strcat(rbuff,"/");
  24.       else flag = !0;
  25.       j = i+1;
  26.       while(j < 8 && (regs & (1 << j))) j++;
  27.       if(--j > i+1) {
  28.         strcat(rbuff,REG[i]);
  29.         strcat(rbuff,"-");
  30.         strcat(rbuff,REG[j]);
  31.         i = j+1;
  32.       }
  33.       else {
  34.         strcat(rbuff,REG[i]);
  35.         i++;
  36.       }
  37.     }
  38.     else i++;
  39.   } 
  40.   while(i < 15) {
  41.     if(regs & (1 << i)) {
  42.       if(flag) strcat(rbuff,"/");
  43.       else flag = !0;
  44.       j = i+1;
  45.       while(j < 15 && (regs & (1 << j))) j++;
  46.       if(--j > i+1) {
  47.         strcat(rbuff,REG[i]);
  48.         strcat(rbuff,"-");
  49.         strcat(rbuff,REG[j]);
  50.         i = j+1;
  51.       }
  52.       else {
  53.         strcat(rbuff,REG[i]);
  54.         i++;
  55.       }
  56.     }
  57.     else i++;
  58.   } 
  59. }
  60.  
  61. void movemstr(struct fd *fd)
  62.  
  63. {
  64.   UWORD regs = 0;
  65.   int i;
  66.  
  67.   offset = 4;
  68.  
  69.   for(i = 0;i < fd->fd_NumParams;i++) 
  70.     regs |= (1 << fd->fd_Parameter[i]);
  71.  
  72.   regs |= (1 << 14);       /* +A6 */
  73.   regs &= ~(3 + (3 << 8)); /* -D0/D1/A0/A1 */
  74.  
  75.   for(i = 0;i < 16;i++)
  76.     if(regs & (1 << i)) offset += 4;
  77.  
  78.   dobuff(rbuff,regs);
  79. }
  80.  
  81. #define BUFFLEN 256
  82.  
  83. extern void addext(STRPTR buff,LONG len,STRPTR orig,STRPTR xt);
  84.  
  85. long __oslibversion = 37;
  86.  
  87. UBYTE verstag[] = "$VER: fd2stub 1.1 " __AMIGADATE__ ;
  88.  
  89. UBYTE template[] = "FDFILE/A,STUBFILE/A";
  90.  
  91. LONG args[2] = { 0, 0};
  92.  
  93. int main(int argc,char **argv)
  94.  
  95. {
  96.   int i;
  97.   int flag = 0;
  98.   int retval = 0;
  99.   struct RDArgs *rda;
  100.   UBYTE buff[BUFFLEN];
  101.   BPTR infile = 0,outfile = 0;
  102.   struct fd fd;
  103.  
  104.   if(argc == 0) return(20); /* we do not run from WB */
  105.  
  106.   rda = ReadArgs(template,args,0);
  107.   if(rda) {
  108.     addext(buff,BUFFLEN,(STRPTR)args[0],".fd");
  109.     infile = Open(buff,MODE_OLDFILE);
  110.     if(!infile) {
  111.       Printf("Could not open .fd file !\n");
  112.       retval = 10;
  113.     }
  114.  
  115.     addext(buff,BUFFLEN,(STRPTR)args[1],".a");
  116.     outfile = Open(buff,MODE_NEWFILE);
  117.     if(!outfile) {
  118.       Printf("Could not open stub file !\n");
  119.       retval = 10;
  120.     }
  121.  
  122.     FreeArgs(rda);
  123.   }
  124.   else retval = 10;
  125.  
  126.   if(!retval) {
  127.     FPrintf(outfile,"* %s\n\n",argv[2]);
  128.     FPrintf(outfile,"\tSECTION\tTEXT,CODE\n\n"); 
  129.  
  130.     InitFD(infile,&fd);
  131.  
  132.     do {
  133.       switch(ParseFD(&fd)) {
  134.         case FD_KEYWORD:
  135.           if(!flag && fd.fd_BaseName[0]) {
  136.             FPrintf(outfile,"\tXREF\t%s\n\n",fd.fd_BaseName);
  137.             flag = !0;
  138.           }
  139.           break;
  140.         case FD_FUNCTION:
  141.           movemstr(&fd);
  142.           if(fd.fd_State & FD_PRIVATE) {
  143.             FPrintf(outfile,"* _LVO%s\tEQU\t%ld\n*\n*\tXDEF\t_LVO%s\n",
  144.                             fd.fd_Function,fd.fd_Offset,fd.fd_Function);
  145.             FPrintf(outfile,"*\tXDEF\t_%s\n",fd.fd_Function);
  146.             FPrintf(outfile,"*\n* _%s:\n",fd.fd_Function);
  147.             if(LibCallAlias(&fd)) {
  148.               FPrintf(outfile,"*\n*\tXDEF\t_%s\n",fd.fd_Function);
  149.               FPrintf(outfile,"*\n* _%s:\n",fd.fd_Function);
  150.             }
  151.             if(offset > 8)
  152.               FPrintf(outfile,"*\tmovem.l\t%s,-(SP)\n",rbuff);
  153.             else
  154.               FPrintf(outfile,"*\tmove.l\t%s,-(SP)\n",rbuff);
  155.             FPrintf(outfile,"*\tmove.l\t%s,A6\n",fd.fd_BaseName);
  156.             for(i = 0;i < fd.fd_NumParams;i++) 
  157.               FPrintf(outfile,"*\tmove.l\t%ld(SP),%s\n",offset+4*i,
  158.                               REG[fd.fd_Parameter[i]]);
  159.             FPrintf(outfile,"*\tjsr\t%ld(A6)\n",fd.fd_Offset);
  160.             if(offset > 8)
  161.               FPrintf(outfile,"*\tmovem.l\t(SP)+,%s\n",rbuff);
  162.             else
  163.               FPrintf(outfile,"*\tmove.l\t(SP)+,%s\n",rbuff);
  164.             FPrintf(outfile,"*\trts\n\n");
  165.             if(TagCallName(&fd)) {
  166.               FPrintf(outfile,"*\n*\tXDEF\t_%s\n",fd.fd_Function);
  167.               FPrintf(outfile,"*\n* _%s:\n",fd.fd_Function);
  168.               if(offset > 8)
  169.                 FPrintf(outfile,"*\tmovem.l\t%s,-(SP)\n",rbuff);
  170.               else
  171.                 FPrintf(outfile,"*\tmove.l\t%s,-(SP)\n",rbuff);
  172.               FPrintf(outfile,"*\tmove.l\t%s,A6\n",fd.fd_BaseName);
  173.               i = fd.fd_NumParams - 1;
  174.               if(fd.fd_Parameter[i] < 8) {
  175.                 FPrintf(outfile,"*\tlea\t%ld(SP),A0\n*\tmove.l\tA0,%s\n",
  176.                                 offset+4*i,REG[fd.fd_Parameter[i]]);
  177.               }
  178.               for(i = 0;i < fd.fd_NumParams - 1;i++) 
  179.                 FPrintf(outfile,"*\tmove.l\t%ld(SP),%s\n",offset+4*i,
  180.                                 REG[fd.fd_Parameter[i]]);
  181.               if(fd.fd_Parameter[i] > 7) {
  182.                 FPrintf(outfile,"*\tlea\t%ld(SP),%s\n",offset+4*i,
  183.                                 REG[fd.fd_Parameter[i]]);
  184.               }
  185.               FPrintf(outfile,"*\tjsr\t%ld(A6)\n",fd.fd_Offset);
  186.               if(offset > 8)
  187.                 FPrintf(outfile,"*\tmovem.l\t(SP)+,%s\n",rbuff);
  188.               else
  189.                 FPrintf(outfile,"*\tmove.l\t(SP)+,%s\n",rbuff);
  190.               FPrintf(outfile,"*\trts\n\n");
  191.             }
  192.           }
  193.           else {
  194.             FPrintf(outfile,"_LVO%s\tEQU\t%ld\n\n\tXDEF\t_LVO%s\n",
  195.                             fd.fd_Function,fd.fd_Offset,fd.fd_Function);
  196.             FPrintf(outfile,"\tXDEF\t_%s\n",fd.fd_Function);
  197.             FPrintf(outfile,"\n_%s:\n",fd.fd_Function);
  198.             if(LibCallAlias(&fd)) {
  199.               FPrintf(outfile,"\n\tXDEF\t_%s\n",fd.fd_Function);
  200.               FPrintf(outfile,"\n_%s:\n",fd.fd_Function);
  201.             }
  202.             if(offset > 8) 
  203.               FPrintf(outfile,"\tmovem.l\t%s,-(SP)\n",rbuff);
  204.             else
  205.               FPrintf(outfile,"\tmove.l\t%s,-(SP)\n",rbuff);
  206.             FPrintf(outfile,"\tmove.l\t%s,A6\n",fd.fd_BaseName);
  207.             for(i = 0;i < fd.fd_NumParams;i++) 
  208.               FPrintf(outfile,"\tmove.l\t%ld(SP),%s\n",offset+4*i,
  209.                               REG[fd.fd_Parameter[i]]);
  210.             FPrintf(outfile,"\tjsr\t%ld(A6)\n",fd.fd_Offset);
  211.             if(offset > 8) 
  212.               FPrintf(outfile,"\tmovem.l\t(SP)+,%s\n",rbuff);
  213.             else
  214.               FPrintf(outfile,"\tmove.l\t(SP)+,%s\n",rbuff);
  215.             FPrintf(outfile,"\trts\n\n");
  216.             if(TagCallName(&fd)) {
  217.               FPrintf(outfile,"\n\tXDEF\t_%s\n",fd.fd_Function);
  218.               FPrintf(outfile,"\n_%s:\n",fd.fd_Function);
  219.               if(offset > 8) 
  220.                 FPrintf(outfile,"\tmovem.l\t%s,-(SP)\n",rbuff);
  221.               else
  222.                 FPrintf(outfile,"\tmove.l\t%s,-(SP)\n",rbuff);
  223.               FPrintf(outfile,"\tmove.l\t%s,A6\n",fd.fd_BaseName);
  224.               i = fd.fd_NumParams - 1;
  225.               if(fd.fd_Parameter[i] < 8) {
  226.                 FPrintf(outfile,"\tlea\t%ld(SP),A0\n\tmove.l\tA0,%s\n",
  227.                                 offset+4*i,REG[fd.fd_Parameter[i]]);
  228.               }
  229.               for(i = 0;i < fd.fd_NumParams - 1;i++) 
  230.                 FPrintf(outfile,"\tmove.l\t%ld(SP),%s\n",offset+4*i,
  231.                                 REG[fd.fd_Parameter[i]]);
  232.               if(fd.fd_Parameter[i] > 7) {
  233.                 FPrintf(outfile,"\tlea\t%ld(SP),%s\n",offset+4*i,
  234.                                 REG[fd.fd_Parameter[i]]);
  235.               }
  236.               FPrintf(outfile,"\tjsr\t%ld(A6)\n",fd.fd_Offset);
  237.               if(offset > 8) 
  238.                 FPrintf(outfile,"\tmovem.l\t(SP)+,%s\n",rbuff);
  239.               else
  240.                 FPrintf(outfile,"\tmove.l\t(SP)+,%s\n",rbuff);
  241.               FPrintf(outfile,"\trts\n\n");
  242.             }
  243.           }
  244.           break;
  245.         case FD_ERROR:
  246.           Printf("%s\n",fd.fd_Function);
  247.           retval = 10;
  248.           goto error;
  249.         case FD_COMMENT:
  250.           FPrintf(outfile,"%s\n",fd.fd_Function);
  251.           break;
  252.       }
  253.     } while(!(fd.fd_State & FD_READY));
  254.   
  255.     FPrintf(outfile,"\n\tEND\n");
  256.   }
  257.   
  258. error:
  259.   if(outfile) Close(outfile);
  260.   if(infile) Close(infile);
  261.   
  262.   return(retval);
  263. }
  264.